using System;
using System.Collections.Specialized;
using System.Runtime.Serialization;
using System.Collections;

namespace SistemaLib.sipe.lib
{
	[Serializable()]
	public struct ReglaRota
	{
		public int number;
		public string message;
		public TipoReglaRota tipo;
	}

	public enum TipoReglaRota
	{
		Campos, Duplicado, ConversionDeTipos, Otro
	}

	[Serializable()]
	public class ListaReglasRotas : CollectionBase, IReglaRotaEnumerator, IEnumerable
	{
		int i;

		public ListaReglasRotas()
		{
			i = -1;
		}

		public ReglaRota this[int index]
		{
			get { return ((ReglaRota)(List[index])); }
			set { List[index] = value; }
		}

		public int Add(ReglaRota reglaRota)
		{
			return List.Add(reglaRota);
		}

		public void Insert(int index, ReglaRota reglaRota)
		{
			List.Insert(index, reglaRota);
		}

		public void Remove(ReglaRota reglaRota)
		{
			List.Remove(reglaRota);
		}

		public bool Contains(ReglaRota reglaRota)
		{
			return List.Contains(reglaRota);
		}

		public ReglaRota Current
		{
			get
			{
				if ((i < 0) || (i == List.Count))
					throw new InvalidOperationException();
				return ((ReglaRota)(List[i]));
			}
		}

		ReglaRota IReglaRotaEnumerator.Current
		{
			get
			{
				return Current;
			}
		}

		object IEnumerator.Current
		{
			get
			{
				return Current;
			}
		}

		void IEnumerator.Reset() { i = -1; }

		bool IEnumerator.MoveNext() 
		{
			if (i < List.Count) 
			{
				i++;
			}
			return(!(i == List.Count));
		}

		public new IReglaRotaEnumerator GetEnumerator() 
		{
			return this;
		}

		IEnumerator IEnumerable.GetEnumerator() 
		{
			return GetEnumerator();
		}


	}

	public interface IReglaRotaEnumerator : IEnumerator
	{
		new ReglaRota Current {get;}
	}

	[Serializable()]
	public class BusinessException : ApplicationException
	{
		ListaReglasRotas lista = new ListaReglasRotas();

		public BusinessException(){}

		public BusinessException( string message) : base( message)
		{
			AgregarError( message, 0, TipoReglaRota.Campos);
		}

		public BusinessException( string message, Exception inner) : base( message, inner)
		{
			AgregarError( message, 0, TipoReglaRota.Campos);
		}

		public BusinessException(SerializationInfo info, StreamingContext ctxt) : base( info, ctxt)
		{
			lista = (ListaReglasRotas)info.GetValue("ReglasRotas", typeof(ListaReglasRotas));
		}

		public override void GetObjectData(SerializationInfo info, StreamingContext ctxt)
		{
			info.AddValue( "ReglasRotas", lista);
			base.GetObjectData( info, ctxt);
		}

        public void AgregarError(string message)
        {
            AgregarError(message, 0, TipoReglaRota.Otro);
        }

		public void AgregarError( string message, int number, TipoReglaRota tipo)
		{
			ReglaRota regla = new ReglaRota();
			regla.message = message;
			regla.number = number;
			regla.tipo = tipo;
			
			lista.Add( regla);
		}

		public ListaReglasRotas ListaErrores
		{
			get
			{
				return lista;
			}
		}

		public override string ToString()
		{
			string mensaje = "";

			foreach( ReglaRota regla in this.ListaErrores)
			{
				mensaje += regla.message + "|" + regla.number.ToString() + "|" + TipoReglaRotaToString( regla.tipo) + "\n";
			}
			return mensaje;
		}

		private string TipoReglaRotaToString( TipoReglaRota tipo)
		{
			string resultado = "";
			switch( tipo)
			{
				case TipoReglaRota.Campos:
					resultado = "Campos";
					break;
				case TipoReglaRota.ConversionDeTipos:
					resultado = "ConversionDeTipos";
					break;
				case TipoReglaRota.Duplicado:
					resultado = "Duplicado";
					break;
			}
			return resultado;
		}

        public override string Message 
        {
            get
            {
                string msg = "";
                foreach (ReglaRota regla in ListaErrores)
                {
                    if (msg != "")
                        msg += ",";
                    msg += regla.message;
                }
                if (base.Message != "")
                    msg = base.Message + "," + msg;

                return msg;
            }
        }


	}
}
